package com.leetcode.two_pointers;

import java.util.Arrays;

/**
 * @author Dennis Li
 * @date 2020/9/8 9:24
 */
public class ThreeSumClosest_16 {

    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int min = Integer.MAX_VALUE, res = 0;
        for (int k = 0; k < nums.length - 2; k++) {
            // 跳过起点指针重复的节点，之所以是对比k和k-1
            // 是因为最开始默认是使用的重复数中的第一个，所以下一次需要跳出这个重复数区间
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int i = k + 1, j = nums.length - 1;
            while (i < j) {
                int sum = nums[k] + nums[i] + nums[j];
                int left = nums[i], right = nums[j];
                // 记录绝对值对比
                if (min > Math.abs(sum - target)) {
                    min = Math.abs(sum - target);
                    // 更新答案
                    res = sum;
                }
                // 如果sum比target大，为了让两者更接近，需要将j向左移 -- 是升序数组
                // 下同理
                if (sum > target) {
                    // 这一步是用于跳过重复的值
                    while (i < j && nums[j] == right) j--;
                } else if (sum < target) {
                    while (i < j && nums[i] == left) i++;
                } else {
                    // 如果为0，直接返回当前sum
                    return sum;
                }
            }
        }
        return res;
    }

    class Solution {
        public int threeSumClosest(int[] nums, int target) {
            return 0;
        }
    }
}
